from selenium import webdriver  # 导入Selenium的webdriver模块，用于控制浏览器
from selenium.webdriver.common.by import By  # 导入By类，用于指定元素定位方式
from selenium.webdriver.support.ui import WebDriverWait  # 导入WebDriverWait用于显式等待
from selenium.webdriver.support import expected_conditions as EC  # 导入预期条件模块，用于等待特定条件
from selenium.common.exceptions import TimeoutException  # 导入超时异常
import time  # 导入time模块，用于添加延时
from cfg import *  # 导入配置文件中的所有设置


class BaseWebDriver:
    # 类变量，用于存储共享的WebDriver实例
    _shared_driver = None

    def __init__(self):
        if BaseWebDriver._shared_driver is None:
            # 创建Chrome选项（禁用 Chrome 浏览器的日志输出，让 Selenium 测试脚本的运行结果更简洁）
            options = webdriver.ChromeOptions()
            options.add_experimental_option('excludeSwitches', ['enable-logging'])

            BaseWebDriver._shared_driver = webdriver.Chrome(options=options)
        self.wd = BaseWebDriver._shared_driver
        # 设置全局隐式等待为兜底时长（显式与隐式均基于同一个 self.wd）
        self.wd.implicitly_wait(IMPLICIT_WAIT_SECONDS)
        # 提供统一显式等待实例（常规与短时）
        self.wait = WebDriverWait(self.wd, EXPLICIT_WAIT_SECONDS, poll_frequency=POLL_FREQUENCY_SECONDS)
        self.wait_short = WebDriverWait(self.wd, SHORT_EXPLICIT_WAIT_SECONDS, poll_frequency=POLL_FREQUENCY_SECONDS)

    def del_first_item(self) -> bool:
        """
        删除页面上结果列表中的第一个项目，并根据操作结果返回一个布尔值。
        """
        # 等待第一个删除按钮可点击（短显式等待）
        try:
            btn = self.wait_short.until(
                EC.element_to_be_clickable(
                    (By.CSS_SELECTOR, '.result-list-item:first-child .result-list-item-btn-bar span:first-child')
                )
            )
        except TimeoutException:
            return False
        btn.click()
        # 等待并处理弹窗（短显式等待）
        try:
            self.wait_short.until(EC.alert_is_present())
            self.wd.switch_to.alert.accept()
        except TimeoutException:
            pass
        return True


    def get_alert_text(self):
        """
        获取页面alert弹窗的文本内容
        
        Returns:
            str: alert弹窗的文本内容，如果没有alert则返回空字符串
        """
        try:
            # 等待alert出现（短显式等待）
            self.wait_short.until(EC.alert_is_present())
            alert = self.wd.switch_to.alert
            alert_text = alert.text
            alert.accept()  # 点击确定按钮关闭alert
            return alert_text
        except TimeoutException:
            # 如果没有alert或者超时，返回空字符串
            return ""

    @classmethod
    def quit_driver(cls):
        """
        关闭浏览器并清空共享记录
        """
        if cls._shared_driver is not None:
            cls._shared_driver.quit()
            cls._shared_driver = None